package user

type UserAuthInfo struct {
	UserID    int64 // 对应Java中的Long
	Username  string
	Nickname  string
	DeptID    int64 // 对应Java中的Long
	Password  string
	Status    int
	Roles     map[string]bool // 使用map模拟Set<String>
	Perms     map[string]bool // 使用map模拟Set<String>
	DataScope int
}

func (s *service) GetUserAuthInfo(username string) *UserAuthInfo {
	info := s.getUserInfo(username)
	return info
}

func (s *service) getUserInfo(username string) *UserAuthInfo {
	// 初始化用户认证信息变量，初始值为nil
	var authInfo *UserAuthInfo
	// 编写查询SQL语句，联接多个表来获取用户和角色信息
	// 使用LEFT JOIN确保即使用户没有关联任何角色，也能正确获取用户的基本信息
	// WHERE子句用于筛选出特定用户名且未被逻辑删除的用户
	query := `
        SELECT 
            t1.id userId,
            t1.username,
            t1.nickname,
            t1.PASSWORD,
            t1.STATUS,
            t1.dept_id,
            t3.CODE
        FROM 
            sys_user t1
            LEFT JOIN sys_user_role t2 ON t2.user_id = t1.id
            LEFT JOIN sys_role t3 ON t3.id = t2.role_id
        WHERE 
            t1.username = ? AND t1.deleted = 0
    `
	// 执行SQL查询，将结果存储到authInfo中
	// 使用Scan方法是因为可能返回多条记录，但在这里我们期望只有一条记录匹配
	err := s.db.GetDbR().Raw(query, username).Scan(&authInfo)
	// 如果执行查询时发生错误，则返回错误信息
	if err != nil {
		panic(err)
	}
	// 返回查询到的用户认证信息，如果没有找到匹配的记录，authInfo将为nil
	return authInfo
}
